iT邦幫忙

2021 iThome 鐵人賽

DAY 11
0

接下來就可以利用上面的 meta-annotation 去定義我們的屬性。

@Target(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY)
@Retention(AnnotationRetention.SOURCE)
annotation class RssTag

我們把 @RssTag 這個 annotation 定義為可以標註在 class 和 class 的 property ,然後 retention 下在 SOURCE ,因為我們使用 annotation processor ,不是用 reflection 也不需要存在 compile 過的檔案。

Annotation 裡面還可以塞自己定義的屬性,像是字串、陣列,甚至是自定義的 class 型別也是可以的。在這邊,我們加入要 parse 的 tag 名稱和它爬的平台順序陣列。

enum class OrderType {
    RSS_STANDARD, ITUNES, GOOGLE
}

@Target(AnnotationTarget.CLASS, AnnotationTarget.PROPERTY)
@Retention(AnnotationRetention.SOURCE)
annotation class RssTag(
    val name: String = "",
    val order: Array<OrderType> = [OrderType.RSS_STANDARD, OrderType.ITUNES, OrderType.GOOGLE]
)

當我們在讀取 annotation 時,馬上就可以知道該 class 和 property 是要存放哪個名稱的 tag ,以及它的平台讀取的優先順序。除了 tag 之外,我們也可以針對 RSS value 和 attribute 去定義 @RssValue@RssAttribute 。如果這個 tag 的名稱很特別,我們想要特別客製一個去爬取資料,也有定義 @RssRawData 來處理這種狀況。下篇文章我們將會講解這幾個 annotation 的設計想法。

參考資料:

https://kotlinlang.org/docs/annotations.html


上一篇
Annotation 處理時機
下一篇
Annotation 的設計與想法
系列文
如何使用 Kotlin Annotation Processor 做出自己的 Custom Data Parser Library30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言